package cn.geoportal.benoserver.mapper;

import cn.geoportal.benoserver.entity.PoiInfo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

/**
 * @Entity cn.geoportal.benoserver.entity.PoiInfo
 */
public interface PoiInfoMapper extends BaseMapper<PoiInfo> {
    /**
     * 1. 添加POI
     * @param name
     * @param address
     * @param lat
     * @param lng
     * @param geomStr
     * @return
     */
    @Select("INSERT INTO t_poiinfo(name, address, phone, lat, lng, geom) values(#{name}, #{address}, #{phone}, #{lat}, #{lng}, ST_GeomFromText(#{geomStr}, 4326) ) RETURNING id")
    @Options(flushCache = Options.FlushCachePolicy.TRUE)
    int addPoiInfo(@Param("name") String name, @Param("address") String address, @Param("phone") String phone,
                   @Param("lat") double lat, @Param("lng") double lng, @Param("geomStr") String geomStr);

    /**
     * 2. 分页展示POI
     */
    IPage<PoiInfo> queryPoiInfoPage(Page<PoiInfo> page, @Param(Constants.WRAPPER) QueryWrapper<PoiInfo> wrapper);

    /**
     * 3. 获取指定的id的POI
     * @param id
     * @return
     */
    PoiInfo getPoiInfoById(Integer id);

    /**
     * 4. 更新指定id的POI
     * @param id
     * @param name
     * @param address
     * @param phone
     * @param lat
     * @param lng
     * @param geomStr
     * @return
     */
    @Select("UPDATE t_poiinfo SET name=#{name}, address=#{address}, phone=#{phone}, lat= #{lat}, lng=#{lng}, geom= ST_GeomFromText(#{geomStr}, 4326) WHERE id=#{id} RETURNING id")
    @Options(flushCache = Options.FlushCachePolicy.TRUE)
    int updatePoiInfoById(@Param("id") Integer id, @Param("name") String name, @Param("address") String address,
                          @Param("phone") String phone, @Param("lat") double lat, @Param("lng") double lng,
                          @Param("geomStr") String geomStr);

    /**
     * 5. 按距离寻找缓冲区类的所有POI
     * @param pt
     * @param radius
     * @return
     */
    List<PoiInfo> findDistanceWithIn(String pt, double radius);

    /**
     * 5. 寻找最近的POI
     * @param pt
     * @param count
     * @return
     */
    List<PoiInfo> findNearestPOI(String pt, Integer count);
}




